export abstract class CoreCacheService {
  constructor(protected option?: CoreCacheServiceOption) {}

  /**
   * 读取数据
   *
   * @param key
   */
  abstract get(key: string): Promise<string | null>

  /**
   * 设置数据
   *
   * @param key
   * @param data
   */
  abstract set(key: string, data: string): Promise<void>

  /**
   * 删除数据
   *
   * @param key
   */
  abstract del(key: string): Promise<void>

  /**
   * 清空
   */
  abstract clear(): Promise<void>

  /**
   * 是否包含key
   *
   * @param key
   */
  abstract has(key: string): Promise<boolean>

  /**
   * 设置可序列化的对象
   *
   * @param key
   * @param data
   */
  setObj<T extends object>(key: string, data: T): Promise<void> {
    return this.set(key, JSON.stringify(data))
  }

  /**
   * 读取可序列化的对象
   *
   * @param key
   */
  getObj<T extends object>(key: string): Promise<T | null> {
    return this.get(key).then(JSON.parse)
  }

  /**
   * 销毁
   */
  destroy(): Promise<void> {
    return Promise.resolve()
  }

  /**
   * 创建带命名空间的服务
   *
   * @param namespace
   */
  abstract createNSService(namespace: string): CoreCacheService

  /**
   * 生成key
   *
   * @param keys
   * @returns
   */
  protected makeKey(...keys: string[]) {
    return (
      this.option?.namespace != null && this.option?.namespace !== '' ? [this.option.namespace, ...keys] : keys
    ).join('.')
  }
}

export interface CoreCacheServiceOption {
  // 命名空间
  namespace?: string
}
